<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    // 5. 如果整数A 的全部约数（包括1，不包括A 本身）之和等于B，且整数B 的全部约数（包括1，不包括B 本身）之和等于A，则称整数A和B是一对亲密数。求2000 以内的全部亲密数。

    // 获取约数和
    function getSumOfFactor (num) {
      if (typeof(num) !== 'number' || num % 1 !== 0) throw new Error('请传入整数')
      // 从2开始遍历，确保factors有值，便于后面reduce
      var factors = [1]
      var iMax = Math.floor(num / 2)
      for (var i = 2 ; i <= iMax; i++) {
        if (num % i === 0) factors.push(i)
      }
      // 返回数组和
      return factors.reduce((a, b) => a + b)
    }
    // 检查是否含有亲密数，并返回该数的亲密数
    function hasIntimateNum (num) {
      if (typeof(num) !== 'number' || num % 1 !== 0) throw new Error('请传入整数')
      // 如果约数和不等于本身且含有亲密数就返回该数的亲密数
      if (getSumOfFactor(num) !== num && getSumOfFactor(getSumOfFactor(num)) === num) return getSumOfFactor(num)
      return false
    }
    // 获取亲密数到num
    function getIntimateNumUntill (num) {
      if (typeof(num) !== 'number' || num % 1 !== 0) throw new Error('请传入整数')
      // 存放亲密数的数组
      var intimateNum = []
      // 存储已经确认的
      var temp = null
      for (var i = 1; i <= num; i++) {
        // 如果temp等于i则跳过本次循环
        if (intimateNum.indexOf(i) > -1) continue
        var temp = hasIntimateNum(i)
        if (temp && temp >= 1 && temp <= num) {
          intimateNum.push(i, temp)
        }
      }
      return intimateNum
    }
    console.log('求2000 以内的全部亲密数。')
    console.log(getIntimateNumUntill(2000))
  </script>
</body>
</html>